home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
QRZ! Ham Radio 6
/
QRZ Ham Radio Callsign Database - Volume 6.iso
/
mac
/
files
/
amiga
/
csrc720j.lzh
/
mbuser.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-01-18
|
17KB
|
832 lines
/*
* MBUSER.C - 6/28/92
*/
#include "mb.h"
#define uf_inc 100 /* Headroom in user file */
#ifdef MCH_AMIGA
extern short debug;
extern char tmpstr[];
#endif
char *usfile, *usbfile;
USER_HDR *ufhs;
USER *tuser;
char *um[num_um];
char tcall[ln_call];
short maxusers;
#ifndef MCH_AMIGA
static char *users;
#endif
#ifndef MCH_AMIGA
int ufl;
#else
int ufl = -1;
int uifl = -1;
char *user_file = "T:mbuser.index";
#endif
/*
* Clean the user file.
* Force drain of buffers, update of directory items.
*/
clnuser()
{
close(ufl);
ufl = open(usfile, O_RDWR | O_BINARY);
#ifdef MCH_AMIGA
close(uifl);
uifl = open(user_file,O_RDWR | O_BINARY);
#endif
}
/*
* Close the user file.
*/
clsusr()
{
#ifdef MCH_AMIGA
if(ufl >= 0)
#endif
close (ufl);
#ifdef MCH_AMIGA
ufl = -1;
if(uifl >= 0)
close(uifl);
uifl = -1;
#endif
}
/*
* Open the user file.
* Allocate space for the user file records.
*/
opnusr()
{
ufhs = (USER_HDR *) malloc(sizeof(USER_HDR));
tuser = (USER *) malloc(sizeof(USER));
tuser->rn = 0;
/*
* Open the file. If it does not exist, make one.
*/
#ifdef MCH_AMIGA
lock_user();
#endif
ufl = open(usfile, O_RDWR | O_BINARY);
if (ufl < 0)
{
ufl = open(usfile, O_CREAT | O_RDWR | O_BINARY, pmode);
#ifndef MCH_AMIGA
if (ufl < 0) { nofile(usfile); exit(1); }
#else
if(ufl < 0) {
nofile(usfile);
#ifdef MCH_AMIGA
unlock_user();
#endif
done(1);
}
#endif
inuhdr();
write_rec(ufl, 0, (char *)ufhs);
}
/*
* Read the user calls.
*/
read_rec(ufl, 0, (char *)ufhs);
if (ufhs->version isnt us_version)
{
#ifndef MCH_AMIGA
printf("Expected version %d, got version %d\n", us_version, ufhs->version);
#else
sprintf(tmpstr,"Expected version %d, got version %d\n",
us_version,ufhs->version);
ttputs(tmpstr);
#endif
nofile(usfile);
#ifndef MCH_AMIGA
exit(1);
#else
set_user((long)ufhs->count);
unlock_user();
done(1);
#endif
}
maxusers = ufhs->count + uf_inc;
#ifdef MCH_AMIGA
/* size_t and numeric arg to errall*/
#endif
#ifndef MCH_AMIGA
users = (char *) malloc((size_t)ln_call * maxusers);
if (users is NULL) errall(2);
#endif
rdusers();
#ifdef MCH_AMIGA
unlock_user();
#endif
}
/*
* Open the user file and read record zero
*/
readusr()
{
#ifndef MCH_AMIGA
short prev_cnt;
prev_cnt = ufhs->count;
ufl = open(usfile, O_RDWR | O_BINARY);
read_rec (ufl, 0, (char*)ufhs);
if (ufhs->count isnt prev_cnt) rdusers();
#else
lock_user();
ufl = open(usfile, O_RDWR | O_BINARY);
read_rec (ufl, 0, (char*)ufhs);
rdusers();
unlock_user();
#endif
}
/*
* Read each user record, build list of calls.
*/
#ifdef MCH_AMIGA
char first_time = 1;
#endif
rdusers()
{
register int i;
register char *up;
#ifndef MCH_AMIGA
printf("%d users in %s\n", ufhs->count, usfile);
for (i = 1, up = users; i <= ufhs->count; i++, up += ln_call)
{
read_rec(ufl, i, (char *)tuser);
strncpy(up, tuser->call, ln_call);
}
#else
if(first_time) {
first_time = 0;
sprintf(tmpstr,"%d users in %s\n", ufhs->count, usfile);
ttputs(tmpstr);
}
/* If the index file exists, then just open it
otherwise create it from the user.dat file
*/
if((uifl = open(user_file,O_RDWR | O_BINARY)) >= 0)return;
uifl = open(user_file,O_RDWR | O_BINARY | O_CREAT);
for(i = 1; i <= ufhs->count; i++) {
read_rec(ufl, i, (char *)tuser);
write(uifl, tuser->call,ln_call);
}
#endif
}
/*
* initialize the user file header.
*/
inuhdr()
{
curtim();
ufhs->count = 0;
ufhs->version = us_version;
strncpy(ufhs->date, l_date, ln_date);
strncpy(ufhs->time, l_time, ln_time);
ufhs->lmnr = mfhs->next_msg - 1;
fill (ufhs->unu, '\0', ufhsunu);
}
/*
* Do we know this user?
*/
finduser(call)
char *call;
{
register int i;
register char *up;
#ifndef MCH_AMIGA
for (i = 1, up = users; i <= ufhs->count; i++, up += ln_call)
if (matchn(call, up, ln_call)) return i;
#else
check_user();
unlock_user();
lseek(uifl,0L,0);
for(i = 1; i <= ufhs->count; i++) {
read(uifl,tmpstr,(size_t)ln_call);
if(matchn(call, tmpstr, ln_call)) return i;
}
#endif
return 0;
}
/*
* Read in a user record.
*/
rduser(call, buf)
char *call;
USER *buf;
{
register int i;
if (i = finduser(call))
{
read_rec(ufl, i, (char *)buf);
buf->rn = i;
return i;
}
/*
* There wasn't one, make one.
*/
curtim();
buf->rn = 0; /* Mark as non current record */
strncpy(buf->call, call, ln_call);
strncpy(buf->date, l_date, ln_date);
strncpy(buf->time, l_time, ln_time);
buf->msg_number = 0;
buf->ssid = 0;
buf->state = 0;
buf->options = 0;
buf->log_count = 0;
buf->port = ' ';
ljsf(buf->handle, um[0], ln_handle);
fill(buf->path, ' ', pathl);
*buf->path = '\0';
fill(buf->home_bbs, ' ', ln_call);
fill(buf->zip, ' ', ln_zip);
#ifdef MCH_AMIGA
fill(buf->qth, ' ',ln_qth);
#endif
fill(buf->unu, 0, userunu);
return 0;
}
/*
* Update the user record to the file.
*/
upduser(buf)
USER *buf;
{
#ifdef MCH_AMIGA
check_user();
#endif
if (s_flag & s_dv) begin_lock();
read_rec(ufl, 0, (char*)ufhs);
if (!buf->rn)
{
#ifndef MCH_AMIGA
if (ufhs->count >= maxusers)
{
if (s_flag & s_dv) end_lock();
return;
}
strncpy (users + (ln_call * ufhs->count), buf->call, ln_call);
#endif
buf->rn = ++ufhs->count;
#ifdef MCH_AMIGA
lseek(uifl,0L,2);
write(uifl,buf->call,ln_call);
set_user((long)buf->rn);
#endif
}
curtim();
strncpy(buf->date, l_date, ln_date);
strncpy(buf->time, l_time, ln_time);
if (s_flag & s_update)
{
buf->msg_number = mfhs->next_msg;
s_flag clrbit s_update;
}
buf->log_count++;
write_rec(ufl, buf->rn, (char *)buf);
write_rec(ufl, 0, (char *)ufhs);
if (s_flag & s_dv) end_lock();
#ifdef MCH_AMIGA
unlock_user();
#endif
}
/*
* Print the address of BBS in STATES.MB
*/
pstates()
{
FILE *hier;
char hiercall[ln_call];
port->msg = mfind;
if ((hier = fopen( stfile, "r")) is NULL) return;
while (fgets(tmp->scr, linelen, hier) isnt NULL)
{
pcall(hiercall, tmp->scr);
if (wcm(hiercall, tcall))
{
outstr("BBS Address -> ");
outstr(tmp->scr);
outchar('\n');
port->msg = NULL;
break;
}
}
fclose(hier);
return;
}
/*
* Print info about a user.
*/
puser()
{
register int i;
register PORTS *p;
pcall(tcall, port->fld[1]);
if (!(i = finduser(tcall))) { pstates(); return; }
read_rec(ufl, i, (char *)tuser);
if ((p = findport(tuser->port)) is NULL)
sprintf( tmp->scr, "Port %c\n", tuser->port);
else
sprintf(tmp->scr, "%s\n", p->name);
if(tuser->port isnt 'Z')
{
outnb(tuser->call, ln_call);
outstr(" connected on ");
outstr(tmp->scr);
}
outnb(tuser->call, ln_call);
if (tuser->port is 'Z')
{
outstr(" Linked to "); outnb(cport->user->call, ln_call);
outstr(" Through the GateWay at "); outstr(tuser->path);
}
else if (!*tuser->path)
{
outstr(" is a direct connect from "); outnb(cport->user->call, ln_call);
}
else
{
outstr(" connected to "); outnb(cport->user->call, ln_call);
outstr(" via "); outstr(tuser->path);
}
outchar('\n');
outnb(tuser->call, ln_call);
sprintf(tmp->scr, " Last connected on %6.6s at %4.4s\n",
tuser->date, tuser->time);
outstr(tmp->scr);
outstr("Name - ");
outnb(tuser->handle, ln_handle);
if (tuser->state & u_home)
{
outstr(", Mail bbs - ");
outnb(tuser->home_bbs, ln_call);
}
if (tuser->state & u_qth)
{
sprintf(tmp->scr, ", QTH - %s", tuser->qth);
outstr(tmp->scr);
}
if (tuser->state & u_zip)
{
outstr(", Zip - ");
outnb(tuser->zip, ln_zip);
}
outchar('\n');
}
/*
* Print a user record.
*/
prtuser(p)
USER *p;
{
fill(port->cmd, ' ', 7);
if (p->options & u_local) port->cmd[0] = 'L';
if (p->options & u_bbs) port->cmd[1] = 'B';
if (p->options & u_expert) port->cmd[2] = 'E';
if (p->options & u_delete) port->cmd[3] = 'D';
if (p->options & u_sysop) port->cmd[4] = 'S';
if (p->options & u_exclude) port->cmd[5] = 'X';
if (p->options & u_hold) port->cmd[6] = 'H';
sprintf(tmp->scr,
"%6.6s %6.6s %4.4s %4d %5u %6.6s %2.2d%c%7.7s %-12.12s %6.6s\n%-20.20sPath: %s\n",
p->call, p->date, p->time, p->log_count,
p->msg_number, p->home_bbs, p->ssid,
p->port, port->cmd, p->handle, p->zip, p->qth, p->path);
outstr(tmp->scr);
}
/*
* The "display users" command.
*/
duser()
{
register int i;
register short ok;
if (port->flds is 1) pgst(um[2]); else
{
if ((port->fl = fopen(port->fld[1], "r")) isnt NULL)
{ fclose(port->fl); port->msg = mexst; return; }
if ((port->fl = fopen(port->fld[1], "w")) is NULL)
{ port->msg = mcant; return; }
}
#ifdef MCH_AMIGA
check_user();
unlock_user();
#endif
for (i = ufhs->count; i; i--)
{
read_rec(ufl, i, (char *)tuser);
ok = false;
switch(port->opt2)
{
case 'L' : ok = (tuser->options & u_local); break;
case 'M' : ok = (tuser->options & u_bbs); break;
case 'S' : ok = (tuser->options & u_sysop); break;
case 'U' : ok = true; break;
case 'X' : ok = (tuser->options & u_exclude); break;
}
if (ok)
{
if (port->flds is 1)
{
pghd();
prtuser(tuser);
if (pgck() is 'Q') return;
if (pgck() is 'Q') return;
}
else
{
prtuser(tuser);
fprintf(port->fl, "%s", tmp->scr);
}
}
}
if (port->flds is 1) pgdn(); else fclose(port->fl);
}
/*
* The N, NE, NH, NQ, NZ (update my user info) commands.
*/
chguser()
{
port->msg = mdone;
switch(port->opt2)
{
case ' ' : ljsf(port->user->handle, port->line + 2, ln_handle);
port->user->state setbit u_name;
break;
case 'E' : port->user->options flipbit u_expert;
break;
case 'H' : if (!iscall(port->fld[1]))
{
port->msg = mwhat;
break;
}
if (matchn(port->user->call, port->fld[1], strlen(port->fld[1])))
{
port->msg = um[8];
break;
}
pcall(port->user->home_bbs, port->fld[1]);
if (matchn(port->user->home_bbs, cport->user->call, ln_call))
port->user->options setbit u_local;
else port->user->options clrbit u_local;
port->user->state setbit u_home;
port->user->state clrbit u_sent;
break;
case 'P' : port->user->state flipbit u_pause;
if (port->user->state & u_pause) outstr("pause off ");
#ifndef MCH_AMIGA
else outstr("on ");
#else
else outstr("pause on ");
#endif
break;
case 'Q' : remnl(port->line);
strncpy(port->user->qth, port->line+3, ln_qth);
port->user->state setbit u_qth;
break;
case 'Z' : ljsf(port->user->zip, port->fld[1], ln_zip);
port->user->state setbit u_zip;
port->user->state clrbit u_sent;
break;
}
}
/*
* EU command with no argument.
* Loop through all users, ask delete for each one.
*/
edusera()
{
register word i;
#ifdef MCH_AMIGA
check_user();
unlock_user();
#endif
for (i = ufhs->count; i; i--)
{
read_rec(ufl, i, (char *)tuser);
if (tuser->rn isnt i)
{
sprintf(tmp->scr, "User record %u has record # %u\n", i, tuser->rn);
tuser->rn = i;
}
prtx(um[2]);
prtuser(tuser);
prtx(um[3]); getcmd();
if (port->mode & gone) return;
if (port->opt1 is 'Q') return;
if (port->opt1 is 'Y')
{
tuser->options |= u_delete;
write_rec(ufl, tuser->rn, (char *)tuser);
}
}
}
/*
* Edit a user record.
*/
eduser()
{
register USER *u;
pcall(tcall, port->fld[1]);
if (matchn(tcall, port->user->call, ln_call)) u = port->user;
else { u = tuser; rduser(tcall, u); }
while(*port->fld[0] isnt '\0')
{
prtuser(u);
outstr("PRIVILEGE: (D)elete (E)xpert (B)bs (S)ysop e(X)clude h(O)ld\n");
outstr("DATA: (C)all ss(I)d (N)ame por(T) (P)ath (H)ome (Q)th (Z)ip\n");
getcmd();
if (port->mode & gone) return;
switch(*port->fld[0])
{
case 'D' : u->options flipbit u_delete; *port->fld[0] = '\0'; break;
case 'E' : u->options flipbit u_expert; break;
case 'B' : u->options flipbit u_bbs; break;
case 'O' : u->options flipbit u_hold; break;
case 'S' : u->options flipbit u_sysop; break;
case 'X' : u->options flipbit u_exclude;break;
case 'C' : if (*port->fld[1]) pcall(u->call, port->fld[1]); break;
case 'I' : u->ssid = atoi(port->fld[1]); break;
case 'N' : if (*port->fld[1])
{
u->state setbit u_name;
ljsf(u->handle, port->line+2, ln_handle);
}
break;
case 'T' : if (*port->fld[1]) u->port = *port->fld[1]; break;
case 'P' : if (port->fld[1]) strncpy(u->path, port->fld[1], pathl);
else *u->path = '\0'; break;
case 'H' : if (*port->fld[1])
{
u->state setbit u_home;
u->state clrbit u_sent;
pcall(u->home_bbs, port->fld[1]);
if (matchn(u->home_bbs, cport->user->call, ln_call))
u->options setbit u_local; else u->options clrbit u_local;
}
else
{
fill(u->home_bbs, ' ', ln_call);
u->options clrbit u_local;
u->state clrbit u_home;
u->state setbit u_sent;
}
break;
case 'Q' : if (*port->fld[1])
{
u->state setbit u_qth;
remnl(port->line);
strncpy(u->qth, port->line+2, ln_qth);
}
else
{
fill(u->qth, '\0', ln_qth);
u->state clrbit u_qth;
}
break;
case 'Z' : if (*port->fld[1])
{
u->state setbit u_zip;
u->state clrbit u_sent;
ljsf(u->zip, port->fld[1], ln_zip);
}
else
{
fill(u->zip, ' ', ln_zip);
u->state clrbit u_zip;
u->state setbit u_sent;
}
break;
}
}
/*
* If this is a new user, add to the list.
*/
upduser(u);
}
/*
* Backup the user file.
*/
untuser()
{
register char *rp, *wp, *lp;
register int uflb;
register int incnt, inrec;
if (sure()) return;
prtx(um[1]);
lp = tmp->scr + (RECSIZE * (scrmax / RECSIZE));
upduser(port->user);
close(ufl);
unlink(usbfile);
if (samedir(usfile, usbfile)) rename(usfile, usbfile);
else copy(usfile, usbfile, false);
unlink(usfile);
ufl = open(usfile, O_CREAT | O_RDWR | O_BINARY, pmode);
uflb = open(usbfile, O_RDONLY | O_BINARY);
incnt = ufhs->count;
inuhdr();
inrec = 1;
while(incnt)
{
for (rp = tmp->scr; (rp < lp) and incnt;)
{
incnt--;
read_rec(uflb, inrec++, rp);
if (!(((USER *)rp)->options & u_delete)) rp += RECSIZE;
}
for (wp = tmp->scr; wp < rp; wp += RECSIZE)
write_rec(ufl, ++ufhs->count, wp);
}
write_rec(ufl, 0, (char *)ufhs);
close (uflb);
clnuser();
#ifdef MCH_AMIGA
/* clobber the index file
rdusers will recreate it and leave it open
*/
close(uifl);
unlink(user_file);
#endif
rdusers();
rduser(port->user->call, port->user);
}
/*
* If all ports are free, Issue the command for all ports to lockup.
* wait for confirmation and then do the command.
*/
setunt()
{
word pflg;
long l;
#ifndef MCH_AMIGA
if (!(s_flag & s_dv))
{
do_op();
return;
}
/*
* If all windows are free issue the lock command
*/
getbusy();
if (b_flag is p_window)
{
putcomd ('A', 'H');
pflg = getp_flag();
putc_flag (pflg clrbit p_window);
}
else
{
outstr("Other windows BUSY\n");
return;
}
/*
* Wait for windows to confirm the lock by looking for a
* cleared c_flag. Do the command if cleared, otherwise return.
*/
settmr( &l, 20);
while (true)
{
if (!(chktmr(l)))
{
putc_flag(0); break;
}
getc_flag();
if (c_flag is 0)
{
do_op();
break;
}
switchw();
}
putcomd('\0','\0');
#else
if(getbusy()) {
outstr("Other windows BUSY\n");
return;
}
do_op();
unbusy();
#endif
}
do_op()
{
switch(port->opt2)
{
case 'A' :
case 'R' :
case 'M' : if (untmsg()) cprs_bid(); break;
case 'U' : untuser(); break;
default : ;
}
}
#ifdef MCH_AMIGA
check_user()
{
extern long get_user();
lock_user();
if(ufhs->count != get_user())clnuser();
}
#endif